﻿/******************************************
*  Ver 0.01   Carlos López Gómez          *
*             Creados metodos Dibujar,    *     
*             DibujarEncimaPersonaje,     *
*   		  ComprobarSiPuedeMoverse,    *
*   		  LeerArchivoColisiones,      *
*   		  y Escenario.                *
*   		  Con un primer funcionamiento*
*   		  básico                      *   
*******************************************/

using System;
using System.IO;
using System.Collections.Generic;
using System.Collections;

namespace Monkey
{
    class Escenario
    {
        protected Cartel miCartel;
	    protected Image fondo;
        protected Image fondoEncimaPersonaje;
        protected List<ElementoEscenario> elementos;
        protected Hashtable salidasMapa;
        protected string rutaFondo;
        protected string rutaFondoEncimaPersonaje;
        protected string rutaArchivoColisiones;
        protected string[,] zonaCaminable;
        protected int ancho;
        protected int alto;
        protected int xInicial;
        protected int yInicial;
        //por si el mapa es mas estrecho de lo normal, que quede algo centrado
        protected int margenSuperior;
        Sound musicaDeFondo;


        public Escenario ( string rutaEscenario )
        {
            if ( File.Exists ( rutaEscenario ) )
            {
                LeerDatosEscenario ( rutaEscenario );
            }
            fondo = new Image ( rutaFondo );
            fondoEncimaPersonaje = new Image ( rutaFondoEncimaPersonaje );
            xInicial = 0;
            yInicial = 0;
            margenSuperior = 100;
            
            elementos = new List<ElementoEscenario> ();
            LeerArchivoColisiones ();
            salidasMapa = new Hashtable();
            alto += margenSuperior;
            //to do
            miCartel = new Cartel();
            elementos.Add(miCartel);
            //Puerta puerta = new Puerta();
            //elementos.Add(puerta);
            musicaDeFondo = new Sound("data/map1.mid");
            musicaDeFondo.PlayMusicInLoop();
        }


        public string ComprobarCambioMapa(int xPj, int yPj)
        {
            
            return (string)salidasMapa[1];    
        }


        public int GetAncho ()
        {
            return ancho;
        }


        public int GetAlto ()
        {
            return alto;
        }


        public int GetXInicial()
        {
            return xInicial;
        }


        public int GetYInicial ()
        {
            return yInicial;
        }


        public void SetXInicial(int aumento)
        {
            xInicial += aumento;
        }


        public void SetYInicial ( int aumento )
        {
            yInicial += aumento;
        }


        public void Dibujar()
        {
            Hardware.DrawHiddenImage2 ( fondo, 0, margenSuperior, 0, 0, ancho, alto );
            
            for ( int i = 0; i < elementos.Count; i++ )
            {
                elementos[i].Dibujar ();
            }
        }


		//se debe llamar a esta funcion despues de dibujar al personaje
        public void DibujarEncimaPersonaje ()
        {
            Hardware.DrawHiddenImage2 ( fondoEncimaPersonaje, 0, margenSuperior, 0, 0, ancho, alto );
        }


		//comprueba la colision de los pies del personaje con el mapa (en vez de todo el cuerpo)
        public bool ComprobarSiPuedeMoverse (int xPj, int yPj, int altoPj, int anchoPj)
        {
            int yFinalPj = (yPj + altoPj) - margenSuperior;
            int yInicialPj = yFinalPj;
            int xFinalPj = xPj + anchoPj;
            bool hayColision = false;

            for (int fila = yInicialPj; (fila <= yFinalPj) && (!hayColision); fila++)
            {
                for ( int columna = xPj; (columna <= xFinalPj) && ( !hayColision ); columna++ )
                {
                    if ( zonaCaminable[fila, columna] == "X" )
                    {
                        hayColision = true;
                    }
                }
            }

            return hayColision;
        }

		//el archivo que se lee con la siguiente funcion, contiene 1 simbolo 
		//por cada pixel del mapa. Este simbolo puede ser "X" o "O", separados por
		//"," la X significa que no se puede pasar por ese pixel y la O que si se puede
        protected void LeerArchivoColisiones ()
        {
            if ( File.Exists ( rutaArchivoColisiones ) )
            {
                StreamReader fichero;
                string linea;
                fichero = File.OpenText ( rutaArchivoColisiones );
				
				//la primera linea contiene el ancho y alto del mapa ej: "1600*230"
                linea = fichero.ReadLine ();
                int posicionAsterisco = linea.IndexOf ( '*' );

                ancho = Convert.ToInt32 ( linea.Substring ( 0, posicionAsterisco ) );
                alto = Convert.ToInt32 ( linea.Substring ( posicionAsterisco + 1 ) );

                zonaCaminable = new string[alto, ancho];

                for ( int i = 0; i < alto; i++ )
                {
                    linea = fichero.ReadLine ();
                    string[] posiciones = linea.Split ( ',' );
                    for ( int j = 0; j < ancho; j++ )
                        zonaCaminable[i, j] = posiciones[j];
                }
                fichero.Close ();
            }
        }


        protected void LeerDatosEscenario ( string ruta )
        {
            StreamReader lector;
            lector = File.OpenText ( ruta );
            rutaFondo = lector.ReadLine ();
            rutaFondoEncimaPersonaje = lector.ReadLine ();
            rutaArchivoColisiones = lector.ReadLine ();
            lector.Close ();
        }


        public string ComprobarSiHayElemento(int xCursor, int yCursor)
        {
            for (int i = 0; i < elementos.Count; i++)
            {
                int xInicialElemento = elementos[i].GetX() + xInicial;
                int xFinalElemento = xInicialElemento + elementos[i].GetAncho();
                int yInicialElemento = elementos[i].GetY() + yInicial;
                int yFinalElemento = yInicialElemento + elementos[i].GetAlto();

                if ((xCursor >= xInicialElemento) && (xCursor <= xFinalElemento)
                    && (yCursor >= yInicialElemento) && (yCursor <= yFinalElemento))
                {
                    return elementos[i].GetNombre();
                }
            }

            return "";
        }


        public void EjecutarOpcion(string accion, int xCursor, int yCursor)
        {
            for (int i = 0; i < elementos.Count; i++)
            {
                int xInicialElemento = elementos[i].GetX() + xInicial;
                int xFinalElemento = xInicialElemento + elementos[i].GetAncho();
                int yInicialElemento = elementos[i].GetY() + yInicial;
                int yFinalElemento = yInicialElemento + elementos[i].GetAlto();

                if ((xCursor >= xInicialElemento) && (xCursor <= xFinalElemento)
                    && (yCursor >= yInicialElemento) && (yCursor <= yFinalElemento))
                {
                    switch (accion)
                    { 
                        case "  Dar":
                            elementos[i].Dar();
                            break;
                        case "Tirar":
                            elementos[i].Tirar();
                            break;
                        case "Usar":
                            elementos[i].Usar();
                            break;
                        case "  Abrir":
                            elementos[i].Abrir();
                            break;
                        case "Empujar":
                            elementos[i].Empujar();
                            break;
                        case "Coger":
                            elementos[i].Coger();
                            break;
                        case "Cerrar":
                            elementos[i].Cerrar();
                            break;
                        case "Hablar a":
                            elementos[i].HablarA();
                            break;
                        case "  Mirar":
                            elementos[i].Mirar();
                            break;
                    }
                }
            }
        }
    }
}
